#include "main_window.h"

#include <QFileDialog>
#include <QMessageBox>
#include <QProgressBar>
#include <QThread>

#include "generate_file.h"

/**
 * @brief main_window 构造函数
 *
 * 初始化主窗口，包括设置进度条的范围和初始值，配置窗口属性，
 * 并启动一个工作线程用于生成文件。该构造函数连接了多个信号与槽，
 * 以便处理文件生成过程中的各种事件，包括文件打开错误、空文件路径
 * 以及生成完成等情况。
 *
 * @param parent 父窗口指针（默认为 nullptr）
 */
main_window::main_window(QWidget* parent) : QMainWindow(parent), ui(new Ui::main_window) {
    init_ui();       // 初始化页面
    init_connect();  // 信号与槽连接
}

/**
 * @brief main_window 析构函数
 *
 * 释放 UI 资源，确保内存管理。
 */
main_window::~main_window() {
    _working->deleteLater();
    _gen_thread->deleteLater();
    delete ui;
}

/**
 * @brief 选择模板文件按钮槽函数
 *
 * 当用户点击选择模板文件按钮时，打开文件对话框让用户选择模板文件，
 * 并将选择的文件路径设置到对应的文本编辑框中。
 */
void main_window::on_choose_model_file_btn_clicked() {
    const QString model_file_name =
        QFileDialog::getOpenFileName(this, "选择模板文件", "F:/2025秋季助教/反馈", "*.txt");
    // const QString model_file_name = "C:/Users/12398/Desktop/答复/模板.txt";
    ui->model_file_edit->setText(model_file_name);
}

/**
 * @brief 选择生成路径按钮槽函数
 *
 * 当用户点击选择生成路径按钮时，打开目录选择对话框让用户选择生成文件夹，
 * 并将选择的文件夹路径设置到对应的文本编辑框中。
 */
void main_window::on_choose_generation_dir_btn_clicked() {
    const QString gen_dir =
        QFileDialog::getExistingDirectory(this, "选择生成文件夹", "F:2025秋季助教/反馈");
    // const QString gen_dir = "C:/Users/12398/Desktop/答复/test";
    ui->generate_dir_edit->setText(gen_dir);
}

/**
 * @brief 选择数据文件按钮槽函数
 *
 * 当用户点击选择数据文件按钮时，打开文件对话框让用户选择数据文件，
 * 并将选择的文件路径设置到对应的文本编辑框中。
 */
void main_window::on_choose_data_file_btn_clicked() {
    const QString data_file_name =
        QFileDialog::getOpenFileName(this, "选择数据文件", "F:/2025秋季助教/反馈", "*.txt");
    // const QString data_file_name = "C:/Users/12398/Desktop/答复/数据2.txt";
    ui->data_file_edit->setText(data_file_name);
}

/**
 * @brief 开始生成按钮槽函数
 *
 * 当用户点击开始生成按钮时，发出信号以开始生成文件过程，并传递
 * 模板文件路径、数据文件路径以及生成目录路径。
 */
void main_window::on_start_btn_clicked() {
    emit start_generate_file(ui->model_file_edit->text(),
                             ui->data_file_edit->text(),
                             ui->generate_dir_edit->text());
}

/**
 * @brief 初始化 UI 函数
 *
 * 初始化页面，包括设置进度条的范围和初始值，配置窗口属性。
 */
void main_window::init_ui() {
    ui->setupUi(this);
    ui->generate_progress_bar->setRange(0, 100);
    ui->generate_progress_bar->setValue(0);
    ui->text_edit->setReadOnly(true);
    // ui->data_file_edit->setReadOnly(true);
    // ui->model_file_edit->setReadOnly(true);
    // ui->generate_dir_edit->setReadOnly(true);
    ui->data_file_edit->setPlaceholderText("请选择数据文件");
    ui->model_file_edit->setPlaceholderText("请选择模板文件");
    ui->generate_dir_edit->setPlaceholderText("请选择生成文件夹");

    this->setFixedSize(800, 700);
    this->setWindowTitle("错题答复生成");
    this->setWindowIcon(QIcon(":/icon/img/software_icon.png"));

    _gen_thread = new QThread;
    _working = new generate_file;
    _working->moveToThread(_gen_thread);
}

/**
 * @brief 信号与槽连接函数
 *
 * 连接信号与槽，包括文件打开错误、空文件路径、生成完成等情况。
 */
void main_window::init_connect() {
    connect(this, &main_window::start_generate_file, _working, &generate_file::start_generate_file);
    connect(this, &main_window::start_generate_file, this, [&]() {
        _gen_thread->start();
        ui->generate_progress_bar->setValue(0);
        ui->text_edit->clear();
    });

    connect(_working, &generate_file::file_open_error, this, [=](const QString& file_path) {
        QMessageBox::warning(this, "错误", "文件：" + file_path + " 打开失败!");
    });

    connect(_working, &generate_file::file_path_empty, this, [=]() {
        QMessageBox::warning(this, "错误", "文件路径未选择，请选择文件路径");
    });

    connect(_working, &generate_file::finish, this, [=]() {
        _gen_thread->quit();
        _gen_thread->wait();
    });

    connect(_working, &generate_file::send_message, ui->text_edit, &QTextEdit::append);
    connect(_working, &generate_file::send_precent, ui->generate_progress_bar, &QProgressBar::setValue);
    connect(_working, &generate_file::send_ask_ignore, this, [=](QString num) {
        QMessageBox::StandardButton result = QMessageBox::question(this, "发现错误",
                                                                   "发现不存在的错题号：" + num + "是否继续生成？",
                                                                   QMessageBox::Yes | QMessageBox::No,
                                                                   QMessageBox::No);
        if (result == QMessageBox::Yes) {
            ui->generate_progress_bar->setValue(0);
            ui->text_edit->clear();
            emit start_re_generate_file(ui->model_file_edit->text(),
                                        ui->data_file_edit->text(),
                                        ui->generate_dir_edit->text(),
                                        true);
        } else {
            ui->generate_progress_bar->setValue(0);
            emit start_re_generate_file(ui->model_file_edit->text(),
                                        ui->data_file_edit->text(),
                                        ui->generate_dir_edit->text(),
                                        false);
        }
    });
    connect(this, &main_window::start_re_generate_file, _working, &generate_file::start_re_generate_file);
}
